<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>


  <script>
    // ES6 之前通过构造函数 + 原型实现面向对象 编程

    // (1) 构造函数有原型对象prototype
    // (2) 构造函数原型对象prototype 里面有constructor指向构造函数本身
    // (3) 构造函数可以通过原型对象添加方法
    // (4) 构造函数创建的实例对象有 __proto__ 原型指向构造函数的原型对象

    // ES6 通过类实现面向对象编程
    class Star {

      /**
       * 类上面的方法, 类似Java中的静态方法
       */
      static logToString() {
        console.log('I,m logToString', Date.now())
      }

      // 类的所有方法都定义在类的 prototype 属性上
      code() {
        console.log('I,m coding!')
      }

    }

    // 1.类的本质其实还是一个function, 我们也可以简单的认为 类就是 构造函数的另一种写法
    console.log(typeof Star)    // function

    // (1) 类有原型对象prototype
    console.log(Star.prototype)
    // (2) 类原型对象prototype 里面有constructor指向类本身
    console.log(Star.prototype.constructor) // class Star {}
    // (3) 类可以通过原型对象添加方法
    Star.prototype.sing = function () {
      console.log('sing!!!')
    }
    // (4) 类创建的实例对象有 __proto__ 原型指向类的prototype原型对象
    var ldh = new Star();
    console.dir(ldh)
    console.log(ldh.__proto__)

    Star.logToString()    // I,m logToString 1641215234255
  </script>
</body>
</html>
